ilsva, конечно не сработает
оно всех союзников игрока 1 заставляет считать всех компов союзниками и отдать им контроль над своими войсками.
тебе нужна функция PlayerGroup from Player и поменять порядок - сперва комп, потом игрок (а для надежности можно оба направления). Ну и проверку на то, комп ли игрок делать отдельно через if и условия на Player Controller и Player Slot Status.
не знаю даже поищи СТАРЕЙШИХ ИГРОКОВ У ВАРКРАФТА и попроси у них все карты которые они имеют
а дальше пороверь все карты и найди её если не найдёш значит она тебе приснилась)
Для ботов можно имитировать покупку предметов - отнимать деньги и давать предмет. Но это очень простой алгоритм для тупеньких ботов что будут сливаться по КД. Если хочешь слепить нечто, хотя бы изображающее сопротивление - простой покупки предметов никак не хватит. Нужно учитывать как можно больше игровых ситуаций и написать (триггерами) план действий в таких условиях. И тестить, тестить, тестить.
короче лаунчер при запуске палит версию вара и посылает на нужный серв
все
по другому просто никак не может быть
а то, сколько серверов держит один проект - дело уже другое
и с одного пк можно запустить сколько угодно серверов, при наличии рук и ресурсов
Вобщем озарение как всегда пришло внезапно - понял что GetSpellAbilityUnit срабатывает на дамми и записывает в массив его, а не цель щита. Просто передвинул махинации с дамми в конец функции Actions. Всё отменно работает. Всем спасибо все свободны
Мда, кто так делает а? Требование лиж закрывает иконку, эффект то пассивка дает всегда, и пофигу её что там за требование..
Повышай броню так или делай другой эффект улучшения - Способность на уровень.
Сделай 2 уровня у твоих Рунических браслетов на 1 уровне сделай бонус брони 0 а на втором какой хочешь, потом с помощью апгрейда повышай уровень способности (а вы не знали что апгрейды могут повышать уровни способностям, изменять данные аур и так далее?)
WiLian, то есть нужно, чтобы на земле лежала модель, которая выглядит, как пиктограмма предмета, так? Тогда нужна модель квадрата (64х64), которой нужно задать текстуру по пути пиктограммы предмета (ReplaceableTextures\CommandButtons\BTN... , как-то так). Но так придётся делать для каждого предмета. Я так сделал в своей карте: xgm.guru/p/zombie-z/defenders-map. Только у меня круглые картинки, я использовал прозрачное смешивание и чёрную модель круга.
Добрался до компьютера и сделал тебе модель. Для примера выбрал боевые когти.
Делаешь способность пустышку на основе "Канал", далее делаешь триггер с событием "Юнит начал направлять способность" в условиях ставишь
свою способность, а в действиях условиями на наличие предметов делаешь крафт. Всё что я тут написал - это отсылка к темам которые можно самому найти.
не надо удалять war3imported\ надо правильно прописывать путь текстур, у каждой модели есть файлик ридми, и в нем написано по какому пути должны лежать текстуры напритмер ты импортнул модель и текстуру и у тебя получился путь war3imported\ 1.blp а в ридми написано textures\1.blp или просто 1.BLP правишь путь именно так как написано.
а если вдруг нету файлика ридми то модель всегда можно открыть блокном ----> поиск текста "blp" и тебе подстветиться среди символов строка как надо прописать текстуры
Для каждого дерева нужны три модели: обычная, неактивная (с названием Doodads\Terrain\AshenTree\AshenTree0S.mdx, например) и неактивная разрушенная (Doodads\Terrain\AshenTree\AshenTree0D.mdx). У неактивных моделей должна быть только одна анимация — Stand. У первой — только деревце, у второй — только пенёк, соответственно.
Когда с деревом никто не взаимодействует, отображаются неактивные модели. Ты их не заменил, потому такая вот фигня.
Как сделать полноценно работающие деревья с моделями, не заменяющими стандартные, я не знаю. Возможно, никак.
Manulli, на 1.26а есть способ обойти этот лимит с помощью мемхака но он очень сложный
а учитывая твои вопросы ты не сможешь это сделать
так что лучше делай как все
т.е. карта на стандартных моделях а mix заменяет их на твои
в результате те у кого есть mix будут видеть твои модели а те у кого нету будут видеть стандартные модели
ну и в игре сообщение выведи что можно скачать архив с крутыми моделями на таком то сайте
Ige, да о чем вы говорите. ИМХО, самое оптимальное предложение содержится в 3 комментарии.
И еще тут много лишних функций. Да и просто первый признак jass - отсутствие бж за исключением дебага( хоть мои слова кажется трепом и выпендрежем, но без чистого скрипта на нативах.... )
Dota_2015, с какого перепугу ATTACK_TYPE_MAGIC урон от заклинаний? у заклинаний тип атаки ATTACK_TYPE_NORMAL, а у тебя это магическая атака волшебниц да прочей шушеры из кампании, наносит 75% урона про героям и доп урон по тяжёлой броне, маг. резистами не режится ибо физический урон от атаки.
У всех заклинаний, да блин даже у долбаных мин гоблина - тип атаки ATTACK_TYPE_NORMAL.
Про области хз, вот именно их разве не через БД лучше, я же не знаю, как в создаваемой карте они называются - Пещера Тысячи Всхлипов или Пляж Огненных Уток...
Тут просто при входе в область писать ее при событии unit входит в область такую-то, легко же вроде даже на гуи...
А так атака ловится через GetUnitBaseDamage сложить с GetUnitGreenBonusDamage.
Скорость атаки через GetUnitAttackSpeed.
Броня через GetUnitArmor (я, правда, пока не мемхаковской пользуюсь, а другой, влом искать, но опытные мапмейкеры знают, если надо - спросить можно).
хпрег через GetUnitHPRegen + мб БД свое.
Мпрег через GetUnitMPRegen + мб БД свое.
Функции эти все тут github.com/DracoL1ch/WC3Memory/blob/master/war3map.j
По импорту мемхака все тут
Вот как должен выглядеть полностью правильный триггер без утечек, единственная утечка создастся только при первом использовании, это я так понял переменная группы, ее обнулять нельзя, иначе скил будет работать только раз.
считаю глупостью заниматься такими вещами. Только чистый jass и понимание, где что утекает (и оптимизация кода).
Тут столько программистов и до сих пор вы не сделали универсальную библиотеку?
сам удивляюсь. Но помнится кто-то делал. Если честно, jass vjass знаю, и я таким не хочу заниматься, меня все устраивает. Даже, если это все будет, новички все равно будут вопросы задавать, инструкции для новичков faq не читают, поиск не юзают (столько вопросов задавали), учиться не хотят. Считаю это бесполезным занятием. Считаю лучше jass, просто менюшками не удобно пользоваться: в них бывает нет всех команд и функции, + это надо все искать по специальным разделам и др.
Суть в том, что это библиотека должна быть не только у тебя, но и у другого юзера. Если ты сделал новыми менюшками триггер, сохранил карту, передал другому человеку. К него должна быть по идее такая же библиотека, иначе не заработает, или не откроет, так как такой функции в редакторе у него нет.
после разложения костей юниты сами выгружаются из памяти
функция "wait" то же вызывает утечки
она не вызывает утечки, она сама по себе кривая и не подходит под большинство задач
если создать переменную "Point" типа "точка" и изначально задать ей положение центр области "Final", а потом обращаться уже к этой переменной "Point" в триггере событие "боевая единица входит в область "Start", действие "отдать приказ боевой единице следовать в "Point" , то новые точки создаваться не будут?
да
только в гуи еще и создание юнитов утекает тоже насколько я помню, надо тоже заранее точку делать
впринципе можно было бы обойтись одной точкой на все действия, но вам видимо пока рано
В одной из миссий за нежить в TFT есть рычаг, при уничтожении которого определённая область заливается водой. Посмотри, как там сделано. Там Артасу и Ануб'араку надо было пройти сквозь тучу башен, герои их залили водой, башни уничтожились.
Главный кошмар тут, конечно - 14 групп. Пришлось так делать, т. к. принципиально не хочу применять глобалки, а локалки, похоже, после дестройгруп заново не юзабельны.
Это вроде должно быть легко поправить, вместо
call DestroyGroup (firewayunits1)
везде ставь
call GroupClear(firewayunits1)
и в самом конце уже, где идет обнуление переменных, там оставляешь DestroyGroup.
И с чего такая нелюбовь к глобалкам? Хештаблица используется, а это ж тоже глобалка, причем даже не просто глобалка, а супер-глобалка. У меня с ней постоянно головная боль была, из-за возникающих после интенсивной работы странных глюков...
Сейчас как раз делал ИИ для демки. Циклы для подобного - полная жопа. Пытался детерминировать логику максимально, но всеравно выходили либо зацикливания (один тик я хочу пассать, один тик я бегу от гопников, а потом опять пассать), либо неправильные решения (вокруг куча гопников а я ссу). И тут я пришёл к гениальной мысли: сделать по теме синаптических весов из нейронных сетей. Саму нейросеть не реализовывать, но вот именно эту фишку взять. Т.с. берёшь входы и создаёшь весы выходов, составляя их по формулам из входов. Лучший вес выигрывает, задавая задачу на тик, а чтобы не было зацикливания - переопределение таска идёт лишь при определённых условиях (напр. поведение сильно изменилось, противник умер и т.д.). И дебажить можно легко! Вышло неплохо - всем рекомендую :3
Но ведь сами по себе ошибки не происходят.
Причина подобного это А) - невнимательность либо твоя либо автора В) - программное обеспечение
Что бы в дальнейшем все было окей, просто сначала потести карту полностью что бы знать что и как должно быть, а потом вноси изменения, будь внимательней.
Еще советую связаться с автором и поговорить с ним об этой проблеме, или запросить у него еще 1 исходник да бы сверЯться с ним.
Wyett, ты можешь добавлять подобные этим:
function ... takes ... returns ...
Код
endfunction
Резака купить можно, но это будет абсолютно не похоже на покупку дирижабля.
Чтобы было норм читать, надо хотя бы выделять содержимое каждого блока (типа function/endfunction, if/endif, loop/endloop) табуляцией. Если блок внутри блока, то двойная табуляция, и т. д.
В vJASS и cJASS не стоит использовать одновременно C-подобный и Turing-подобный (стандартный JASS) синтаксис.
А если ты неправильно поставишь пробелы, запятые или кавычки, тебе об этом скажет парсер =)
local real x = GetRandomReal(GetRectMinX(GetPlayableMapRect()), GetRectMaxX(GetPlayableMapRect()))
local real y = GetRandomReal(GetRectMinY(GetPlayableMapRect()), GetRectMaxY(GetPlayableMapRect()))
...
(действия с координатами)
...
Любые действия с локейшном можно переделать под координаты, если не используется z-координата, как сказано выше. Но z-координату используют не только лишь все, мало кто может это делать.
И обнулять ничего не придётся, так как действительное число не утекает.
Во-первых, что есть "локальный таймер" ? Это таймер записанный в локальную переменную?
Во-вторых, зачем тебе точка, если ты используешь XY ? Работай с ними
В-третьих, да. Использование в течении всей игры одной заранее созданной точки вызывает меньше нагрузки чем постоянно создание и удаление новых (кто-то там доказывал на примере и цифрами что от ремувнутых точке всё равно остаётся шлак в памяти...)
1)Нужно ли при создании на джассе в конце обнулять/удалять что-то как при создании на ГУИ типо set u = null и т.д.?
Да нужно, но далеко не все. Чекни статьи, там про это расписано подробно.
2)Как видно на скрине юниту даются способности на 10 сек, можно ли в одной строчке это как то написать, а не писать каждый скилл в новой строке? Попытался сделать через , выдало ошибку.
Нет, только по одному. И TriggerSleepAction я бы использовать не стал, вместо них я бы заюзал таймеры.
3)Слышал про при конвертации в текст остаются пару лишних строк в триггере, абсолютно ненужные я удалил(Которые были при создании на ГУИ, скрин 2), нужно ли еще что-то удалять?
Тестил, тестил. Думал найду ошибку. Короче не знаю в чем дело, видимо и в правду баг. Решил по-другому. Ловить поставку, и ловить продажу. То есть ловить то, что пришло, и то, что ушло.
событием - "юнит закладывает в лавку" (EVENT_PLAYER_UNIT_PAWN_ITEM) ловим продажу итемов.
GetSellingUnit() =продающий торговец (типа всякие предметы закладывает в магазин и получает деньги)
GetBuyingUnit()=GetTriggerUnit() = покупающий торговец (это обычно магазин)
событием - "юнит закладывает из лавки (продает артефакт)" (EVENT_PLAYER_UNIT_SELL_ITEM) ловим покупку итемов
GetSellingUnit()=GetTriggerUnit()=продающий торговец (обычно это магазин)
GetBuyingUnit() = покупающий торговец (наш герой получает артефакты)
Решил, я по-своему. Короче, видимо, итем в магазине исчезает при добавлении. Попробовал запоминать все добавленные итемы, и при добавлении я сначала удалю всё в магазине, а потом заново добавлю. Пришлось, еще порядок (номер слотов) запоминать, а то строятся ключи хэша на строгом порядке. Если возьму и заберу итем посередине, придется заново выстраивать порядок. Не знаю, пока тестил много времени, пока без косяков. Главное, что работает. Меня это радует. Но пока не буду спешить. Мне бы хотелось затестить норм.
Собственные попытки в студию, что не получается?
Напомним - ЭТО НЕ СТОЛ ЗАКАЗОВ, здесь задают вопросы про реализацию тех или иных вопросов, спрашивают про ошибки, оптмизацию, отдельные функции. Я не увидел в вашем вопросе ничего кроме невнятного описания механики способности, " вокргу кого то там огненные столбы возникают, и еще порча"...
Filius Dei, во вредные советы подъехали...
Русификатор очень поможет тем кто собрался ломануть чужую карту и сделать её мод, прям ваще жир...
Потом нубам вроде сударя не стоит бежать ломать чужую карту, чето там пытатся копировать - это все бесполезно, недавно был похожий вопрос - помогите взломать карту за вознаграждение, карту сломали - ну а дальше что? Он неспособен ничего сделать потому что просто не понимает как?
Играя в некую карту вы мните себя великими балансерами и картоделами, мол да чё там, шяс подправлю пару значений и все будет норм - нет не будет, это не так просто как может показаться, без понимания устройства карты и знания Jass вам нечего там делать, вы тупо ничего не сможете изменить, да даже скопировать и вставить!
Помните что без труда не выловишь и рыбку из пруда, т.е изи способов в 1 кнопку взять и запилить чужую карту так как вам хочется или вдруг стащить всех героев себе в карту нет, а уж теболее не случится так что вам кто то возьмет и все это сделает вам за спасибо...
Нахрена вам это? Почувствовали себя IseFrog'ом, triggercondition и нужны чтобы не нагружать ненужными действиями движок, а так же разделить код, на частый и легкий и тяжелый и редкий, у фрога так реализованы всякие дебафы вроде уроны, в кондишене проверяется от чего сработал триггер, если это таймер то нанести урон, иначе если триггер сработал от любого другого события то удалить весь эффект и выполнить утилизацию триггера...
В РО, такое невозможно сделать. Подробно на триггерах? Ну вот пример, а если нужно ещё подробнее, то учебник по Jass в руки.
На проклятие в РО,или любой другой спелл,ставится минимальная дистанция
function Trig_Spell_Actions takes nothing returns nothing
local location loc = Location(GetWidgetX(GetSpellAbilityUnit()),GetWidgetY(GetSpellAbilityUnit()))
local unit u = null
if GetSpellAbilityId() == 'АЙ ДИ СКИЛЛА' then
set u = CreateUnitAtLoc(GetOwningPlayer(GetSpellAbilityUnit()),'АЙ ДИ ДАММИ ЮНИТА-ЭФФЕКТА',loc,0.00)
call IssueTargetOrder(u,"curse",GetSpellTargetUnit())
endif
call RemoveLocation(loc)
set loc = null
endfunction
//===========================================================================
function InitTrig_Spell takes nothing returns nothing
local integer i = 0
set gg_trg_Spell = CreateTrigger()
loop
exitwhen i > 12
call TriggerRegisterPlayerUnitEvent(gg_trg_Spell, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
set i = i + 1
endloop
call TriggerAddAction( gg_trg_Spell , function Trig_Spell_Actions )
endfunction
Потом тоже самое, только отследить каст проклятия, проверить тип юнита и удалить его из игры.
Вы не поверите, долго искал, но как только сюда написал, сразу нашёл как это сделать xd
Sequence manager - Stand - Bounds Radius, скопировал значение оттуда, затем Sequence manager - Attack - Bounds Radius, и вставил сюда, всё починилось
нельзя, любое взаимодействие с ними вызовет десинк, а они не только в коде учитываются, но и в той же карте путей. Но еще проще просто протестить самому
Ну карта защищена от ковырялкиных, весь код нужно править.
Да и вовсе понадобится JNGP чтобы сохранить изменения в этой карте.
Карта защищена довольно примитивно, если вы не смогли её запустить - вам явно не стоит этим заниматся.
Не лагает, а загружается дольше - это да, лаги в мультиплеере связаны не с картой а с говвеным пингом до хоста, из за задержек и постоянных дисконектов.
Защита и подпись это две разные вещи!
Защита это повреждения архива карты и или её содержимого с целью невозможности дальнейшей работы с архивом карты публичным софтом.
Подпись - Blizzard - это особый способ упаковки карты и шифрования, запаковать так карту низя - да и бестолку, открыть то её можно в любом случаи, ты же не владелец сервера со 100500 игроками онлайн, чтобы патчить карту до валидной всем кто что то там наковырял.
1.Вам нужна сама картинка, желательно размера 256х256 пикселей (в противном случае качество картинки в игре ухудшится) и обязательно формата tga
2.Теперь нужно импортировать картинку на карту, после этого меняем путь картинки на:
war3mapMap.tga
или
war3mapPreview.tga
Если вы поставите war3mapPreview.tga то картинка будет отображаться только в окне предосмотра карты, а если war3mapMap.tga, то она будет отображаться на миникарте, и если на карте нет картинки с путём war3mapPreview.tga, то будет и в окне предосмотра.
(с) стражNIK
Эм, что сложного? Сражение - лимитировать героев
Далее ставить невидимого даммика возле таверны.
Из-за него ты сможешь выбрать героя, без него, ты не сможешь купить героя(выбрать)
Вобщем озарение как всегда пришло внезапно - понял что GetSpellAbilityUnit срабатывает на дамми и записывает в массив его, а не цель щита. Просто передвинул махинации с дамми в конец функции Actions. Всё отменно работает. Всем спасибо все свободны
Самый простой алгоритм - для каждого юнита-цели создаешь даммик (Юнит со способностью москиты 'Aloc', без модели, тени и с отключенной атакой), который, получив нужный приказ, радостно кидает корни с нужными параметрами в оную цель. Не забудь применить к даммику ограничение времени жизни, чтобы он скастовал и благополучно сдох.
Герою же просто выдаешь пустышку на основе нейтрально-враждебной геройской способности Канал, срабатывание которой и отлавливаешь триггером, делающим вышеуказанные действия.
есть специальная функция на jass, которая называется MoveRect() или SetRect(). С помощью этих функций и перемещаете.
native MoveRectTo takes rect whichRect, real newCenterX, real newCenterY returns nothing
native SetRect takes rect whichRect, real minx, real miny, real maxx, real maxy returns nothing
Если светлячок крип, то по достижению N уровня герой начинает получать меньше опыта от его убийства
На скриншоте показана сама строка отвечающая за набираемый героем опыт от крипов в %
На мой взгляд легче сделать триггер-базу данных и отлавливать смерть юнита, а далее через Если То Иначе сделать получение опыта на каждый тип юнитов.
Если указываешь в настройках материала "Id анимации текстуры", то после сохранения этот параметр опять сбрасывается в "none". Решение:
Сохранить в .mdl, открыть блокнотом. Ищем нужный материал, добавляем новую строчку TVertexAnimId и после пробела ставим id нужной анимации текстуры(обычно 0). Затем кодируем в mdx с помощью MdlVis.
Пример:
Кажется ты не понимаешь, как работают фильтры альфы.
Не понимаю. Как раз поэтому и задал вопрос.
В ME открой модель. Там есть фильтры Addative и Add Alpha, которые работают схожим образом: чем темнее, тем прозрачнее(черный = 100%). Есть какой то альтернативный фльтр, вроде Modulate, который отображает белый как прозрачный. Посмотри в материалах(Window\Material manager\).
Это касательно отображения.
А ошибка скорее всего не в том, но попроси изменить эффект того, кто в этом шарит, ведь если она выбивает после того, как его редактировал ты, значит ты где то напартачил.)
там найти все источники частиц (у них иконки в виде синих/красных стрелочек)
два раза щелкнуть на источник, откроется окно редактирования
там обычно три цвета, вот их можно поменять нажав на кнопку "..." рядом с каждым, открывается цветовой диалог; еще в этом окне можно посмотреть/поменять текстуру источника
Каким оброзом Стан юнит записовался в переменую я не пойму но как то записовался я даже пытался ставить иф чтоб тока герой мог записаца не помагало пришлось после поставет
после запесе
Проблема в том что это конверт из ГУИ со всякими ненужными бжфункциями типа GetLastCreatedLightningBJ() и CountUnitsInGroup(Group) == 0 вместо FirstOfGroup(Group)==null, без форматирования под код, в котором черт ногу сломит. target_integer - переменная объявлена, нигде не используется, и т.д.
Статью уже кидали, ответа на вопрос там нет.
Давно видел эту статейку на HIVE, думал, что её уже давно кинут сюда)
Там и есть ответы на интересующие меня вопросы.
Вот тут ещё об этом.
Берем основную модель, возможно, вообще без мяса, только с гусеницами, но с кучей точек крепления. Также берем кучу моделей-аттачметов, представляющих собой эти самые пушки, корпуса и все прочее. При выборе характеристик модели через диалог или интерфейс соответственно создаем на основной модели эффекты-аттачменты, будет собрана техника. Такие штуки, как двигатель и прочие невидные извне элементы будут скорее входить в математическую модель юнита, но это также можно запилить. Название танка - сразу не скажу, есть ли триггер на смену, но на таблице рекордов можно отобразить что угодно.
2.Тоже можно.
Создаем погодный в определенной местности и делаем два триггера для контроля входа-выхода юнитов из нее. На искомых юнитов применяем нужные способности - и все готово.
Здесь чуть сложнее: нужно постоянно проверять тип местности под юнитом, но тоже можно. Проверка на ограждения тоже может бить сделана.
4.Это уже интереснее. Видел раньше подобное в играх. При каждой атаке юнита случайным образом наносим или не наносим доп. урон, эффект горения, кидаем спелл на цель в зависимости от теоретического места попадания атаки.
5.И это можно. Но нужно писать нестандартную систему Альянса. Но через триггеры и JASS все можно...
Продажа техники - лучше через способность, что бы кидать ее на понравившегося юнита, не стоит покупать кота в мешке. Стоимость должна зависеть от технического уровня юнита, его текущего состояния (мертвый танк попадет вам бесплатно, сами чините!), если он был модернизован дополнительно, то это тоже входит в стоимость. Разрешение на продажу делаем аналогично.
Это легко через Custom Value и переменние.
Как ты понял, все что ты предложил создать можно, но на это нужно потрать хороший кусок времени. Остается пожелать тебе удачи над созданием проекта - мне идея уже нравится.
Sucsonius, через скилы реализовать покупку/продажу юнитов(все действия описывать триггерно, а инфу показывать в мультибоарде)
ещё можно отдать дамми герою приказ на покупку и таким образом уменьшать
можно создать кучу зданий с разным количеством двенадцатого юнита и при необходимости сменить количество удалять здание и создавать новое возвращая выделение и количество юнитов с 1 по 11
можно сделать полноэкранную таверну с помощью дгуи
имхо последнее лучше всего будет Sucsonius:
который обходит данную проблему
костыли не обходят проблему
они извращают всё таким образом что проблема не заметна на фоне этих костылей
если тебе надо обойти проблему то пиши новый вар3
Это дебильная мода из GUI, оформлять в отдельную функцию каждое условие и вызывать его через if, там где можно и просто return.
Разница в том что на эти дополнительные функции тратится больше ресурсов, вот и вся разница - производительность.
Блин - видел очень давно похожую реализацию, но походу 100500 людей так и не научились это делать, написать чтоли самому...
Суть - для продажи предметов, войск, всяких древ талантов - используйте спеллбук + способности на основе - поставка ресурсов.
Помещаем в спеллбук до 11 способностей на основе "Поставка ресусов" - это аналог канала, настраивается приказ и прочее, но самое главное есть поля - стоймость золотом, стоймость деревом, т.е эта абилка может требовать не только ману но и золото с деревом. Так же там стоит вкладка, заряд игрока владельца - очень важная настройка:
Заряд игрока владельца включен - тогда за каст ресурсы будут списыватся только у игрока владельца юнита, при этом неважно что вашим юнитом управляет другой игрок.
Заряд игрока владельца выключен - тогда при касте этой абилки ресурсы будут списыватся со счета игрока, который и отдал приказ, это даже можно отследить, но немного геморойно:
Суть: делаем триггер который срабатывает на приказ каста поставки ресурсов, или события юнит начинает каст способности, условия по вкусу и действия - создать еще 1 триггер, в события которого добавить - ресурсы игрока N изменились (для каждого игрока способного купить), условием - ресурсов стало меньше на стоймость каста абилки, и действие - выключить триггер, записать GetTriggerPlayer() в глобальную переменную или в еще куда, это и будет наш игрок который кликнул на поставку ресурсов, ну и далее утилизируем триггер, удаляя действия. Можно написать все действия в условии, тогда не придется удалять действия.
Так можно отследить кто кастанул абилку поставки ресурсов если юнитом управляют несколько игроков.
это объявление глобальных переменных, так используются и в обычном редакторе. только, если нужно создать свои, мы заходим в редактор переменных и создаем (хоть мы не видим код, а редактор переменных автоматом тип и название внесет в эту конструкцию, что ты выше написал). А в vjass и cjass мы можем объявлять свои переменные в любом участке кода, все что нужно, так это написать так это тип переменной и название переменной на английском.
пример
globals
тип и название переменной
unit U //пример
endglobals
глобальная переменная в отличии от локальной работает везде: в триггере, коде и др. Для всех игроков вроде общие. Не слышал об этом. Похоже, что, да, придется создавать массивы, чтобы у каждого был свой индекс массива.
чтобы создать массив пишут array
unit array U
для новичков
но нужно понимать, что все эти vjass и cjass - это для удобства, компилятор переведет его в обычный jass: все объявленные переменные в разных кусках перенесет наверх при компиляции, вон та же библиотека добавляет в main (главная функция карты) нужные функции, у структур наблюдаются изменения в имени переменных (добавляются в названии переменных и функции приставки от имени структуры и др) и прочее. Если новичок, бери прочитай мануал, потом что-то не понятно (библиотеки, структуры и др), бери пустую карту, напиши код, сохрани и компилируй код, потом архиватором вытащи j-файл, и в текстовике посмотри, сравни. Единственное что не привычно и сложно - синтаксис, ведь не знаешь, какими правилами и сочетаниями слов использовать, к примеру call можно не писать, вместо if endif скобочки и др.
Функшн поинтеров помимо типа code в жассе нет. Можно полагаться только на ExecuteFunc, куда аргументы передаются только глобалками, соответственно никакого тайпчекинга.
Использовать можно например так
struct mystruct
static method mymethod takes nothing returns nothing
call BJDebugMsg("this works")
endmethod
endstruct
function myfunction takes nothing returns nothing
call ExecuteFunc(mystruct.mymethod.name) //ExecuteFunc compatibility
call OnAbilityCast('A000',mystruct.mymethod.name)
//for example, caster system's OnAbilityCast, requires a function name
endfunction
struct linkedList
private static constant timer period = CreateTimer( )
private thistype prev
private thistype next
private stub method destroy takes nothing returns nothing
// Здесь должен находится Ваш код.
set this.prev.next = this.next
set this.next.prev = this.prev
if ( thistype( 0 ).next == 0 ) then
call PauseTimer( thistype.period )
endif
call thistype.deallocate( this )
endmethod
private static method iterate takes nothing returns nothing
local thistype this = thistype( 0 ).next
loop
exitwhen ( this == 0 )
// Здесь должен находится Ваш код.
call this.destroy( )
set this = this.next
endloop
endmethod
private static method create takes nothing returns thistype
local thistype this = thistype.allocate( )
set this.next = thistype( 0 )
set this.prev = thistype( 0 ).prev
set this.next.prev = this
set this.prev.next = this
// Здесь должен находится Ваш код.
if ( this.prev == 0 ) then
call TimerStart( thistype.period, 0.03125, true, function thistype.iterate )
endif
return this
endmethod
endstruct
триггерный ReplaceUnit - это не морф (там удаляют одного, и на месте старого создают нового). Давным-давно когда использовал эту хрень, и столкнулся с кучей проблем: не сохранить всё, точнее не переносится на новую (вот бы близзарды к морфам нативку): эффекты, характеристики, предметы, наложенные баффы. Потому что юнит новый. Лучше используй морф, не знаю, мб попробуй через руны.
совет
Есть еще морф через абилку "темный" (это постоянный морф. Использовал когда-то для курьеров, как в доты. там есть баг, когда увеличивает защиту/атаку. Бывает на единичку увеличивает/уменьшает, а бывает и норм работает, ведет себя по-разному. Не знаю, из-за чего это случается, потом протестирую. Но на курьеров не замечал, так как это не герой, защита нулевая, и тем более у них атака выключена). Поэтому советовали использовать вместо темного обычный морф, попробуй морф с руной
Самое тупое решение - каждые 0.03125 сек сбрасывать выборку любого игрока с этого юнита.
Не очень тупое - сделать 2 одинаковых юнита, одному дав способность москиты, и на время меняя их местами
Проблема решена. Обнаружилась довольно неожиданно - заметил, что во время крита герой не разбивал лицо сам себе, начал искать модификаторы атаки - у героя было 3 пустышки с нулевыми значениями на основе "ракет". При всех пустых значениях вылетает невидимая ракета по самому себе.
» WarCraft 3 / Помогите с ботом!
» WarCraft 3 / Защитный ИИ
» WarCraft 3 / Помогите с предметами!
» WarCraft 3 / Импорт моделей
» WarCraft 3 / Помогите c триггером :c
» WarCraft 3 / Утечка в функции
» WarCraft 3 / Лава
» WarCraft 3 / Есть ли такая команда?
» WarCraft 3 / Вопрос по Jass
» WarCraft 3 / Ошибка с абилкой
» WarCraft 3 / триггер
» WarCraft 3 / triggeraction, triggercondition
» WarCraft 3 / Анимация
» WarCraft 3 / Декорации и вариации
» WarCraft 3 / Deprotect(Помощь)
» WarCraft 3 / По поводу карты
» WarCraft 3 / Как создать способность lifestealer'а infest
» WarCraft 3 / Триггерные спеллы
» WarCraft 3 / Опыт героев
» WarCraft 3 / Текстура эффекта
» WarCraft 3 / I2R
» WarCraft 3 / 2 условия одной функции
» WarCraft 3 / vJass
» WarCraft 3 / Время
» WarCraft 3 / Вопрос по коду из доты